package spring.in.action.chapter_03.spel;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@ComponentScan
@PropertySource("classpath:spring/in/action/chapter_03/Express.properties")
public class SpELConfig
{
    @Bean
    public BankDisc disc1(@Value("#{systemProperties['disc.title']}") String pTitle,
            @Value("#{systemProperties['disc.artist']}") String pArtist)
    {
        /**
         * 一、简单样例<br>
         * 1. 数字：#{3.14159};<br>
         * 2. 科学计数法：#{9.87E4};<br>
         * 3. 字符串 ： #{'Hello'};<br>
         * 4. 布尔： #{false};<br>
         * 5. 调用静态函数： #{T(System).currentTimeMillis()},T()表示是java类;<br>
         * 6. 通过ID引用其他Bean，Bean的属性，Bean的方法，可以不断的传递调用：
         * #{disc1.title.toUpperCase()};<br>
         * 7. 为了防止空指针，类型安全的运算符： ?. #{disc1.title?.toUpperCase()};<br>
         */

        /**
         * 二、运算符<br>
         * 1. 算数运算： +,-,*,/,%,^(乘方)<br>
         * 2. 比较运算： <,>,==,<=,>=,lt(<),gt(>),eq(==),le(<=),ge(>=)<br>
         * 3. 逻辑运算：and,or,not,&&,|,!<br>
         * 4. 条件运算： ?:(ternary)三元运算符,?:(Elvis)<br>
         * 5. 正则表达式：matches
         */

        /**
         * 三、高级样例<br>
         * 1. 周长：#{2*T(java.lang.Math).PI*circle.radius}<br>
         * 2. 面积：#{T(java.lang.Math).PI*circle.radius^2}<br>
         * 3. 字符串拼接：#{disc.title+' by '+disc.artist}<br>
         * 4. 布尔表达式：#{'123'.length() == 3}, #{'123' eq '123'}<br>
         * 5. 三元运算符(ternary)：#{score>100?"Winner!":"Loser"}<br>
         * 6. 三元运算符特殊用法(Elvis 猫王的头发，用于检查null值，并用默认值替代null)：#{null?:"This is
         * Null"}<br>
         * 7. 正则表达式(matches)：#{email matches
         * '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.com'}<br>
         * 8. 随机取数组：#{args[T(Math).random()*args.length]}； 字符串 #{'123'[2]}<br>
         * 9. 查询运算符(.?[])所有符合条件的：#{songs.?[artist eq 'Aerosmith']}<br>
         * 10. 查询运算符(.^[])第一个匹配项：#{songs.^[artist eq 'Aerosmith']}<br>
         * 11. 查询运算符(.$[])最后一个匹配项：#{songs.$[artist eq 'Aerosmith']}<br>
         * 12. 投影运算符(.![])：#{songs.![title]}<br>
         */
        return new BankDisc(pTitle, pArtist);
    }

    @Bean
    public List<BankDisc> discs()
    {
        List<BankDisc> discs = new ArrayList<>();

        discs.add(new BankDisc("T1", "A1"));
        discs.add(new BankDisc("T2", "A1"));
        discs.add(new BankDisc("T3", "A1"));
        discs.add(new BankDisc("T4", "A1"));
        discs.add(new BankDisc("T5", "A1"));
        discs.add(new BankDisc("T1", "A2"));
        discs.add(new BankDisc("T1", "A3"));
        discs.add(new BankDisc("T1", "A4"));

        return discs;

    }
}
